//***************************************************************************************************************
// Функциональное описание:
// Модуль задает задержку на N тактов
//***************************************************************************************************************



`timescale 1ns / 10ps
module mod_delayN (Clock, Reset, DATA_I, DATA_O);

// Глобальные параметры модуля
   parameter  p_delay = 2;  // задержка на текущие значение тактов.
   parameter  p_size  = 8;  // разрядность шины данных.
	
// Входные сигналы модуля
   input wire            Clock, Reset;
	input wire   [p_size - 1:0]   DATA_I;  // шина входных данных.
	
// Выходные сигналы модуля
   output logic [p_size - 1:0]   DATA_O;  // шина выходных данных.

// Локальные параметры модуля
   localparam  p_delay_size = p_delay;    // разрядность счетчика count.
	
// Локальные переменные модуля
   logic [p_delay - 1:0][p_size - 1:0] data_buf;       // объявление буфера входного сообщения.

//###############################################################################################################
// Начало работы блока
//###############################################################################################################	

// Организуем задержку сигнала через буфер.
	always_ff @(posedge Clock, posedge Reset)
		begin
			logic [p_delay_size - 1:0] count;
			if (Reset) data_buf <= 0;
			else
				begin
					data_buf[p_delay - 1] <= DATA_I;
					for (count = p_delay[p_delay_size - 1:0] - 1'b1; count >= 1'b1; count = count - 1'b1) 
						data_buf[count - 1] <= data_buf[count];
				end
		 end
		 
	assign DATA_O = data_buf[0];

//###############################################################################################################
// Конец блока.
//###############################################################################################################
	
endmodule
